package mx.com.switz.dao.Impl;

import java.util.List;
import javax.sql.DataSource;
import mx.com.switz.dao.CategoriaDao;
import mx.com.switz.dto.Categoria;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.ParameterizedBeanPropertyRowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Repository;

@Repository
public class CategoriaDaoImpl extends JdbcDaoSupport implements CategoriaDao {

    private SimpleJdbcInsert simpleJdbcInsert;
    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    @Autowired
    public CategoriaDaoImpl(DataSource dataSource) {
        // se instancia plantilla con la inyeccion del datasource	    
        setDataSource(dataSource);
        simpleJdbcInsert = new SimpleJdbcInsert(getJdbcTemplate().getDataSource()).withTableName("categoria");
        this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
    }
    private static final String SQL_UPDATE_CATEGORIA_XNOMBRE = "UPDATE CATEGORIA set nombre = :nombre,detalles = :detalles WHERE clave =:clave";
    private static final String SQL_DELETE_CATEGORIA = "DELETE FROM CATEGORIA WHERE clave = :clave";
    private static final String SQL_SELECT_CATEGORIA = "SELECT clave, nombre,detalles FROM CATEGORIA";
    // private static final String SQL_SELECT_CATEGORIA_BY_ID = SQL_SELECT_CATEGORIA
    //+ " WHERE id = ?";
    private static final String SQL_SELECT_CATEGORIA_BY_NOMBRE = SQL_SELECT_CATEGORIA + " WHERE nombre = :nombre";

    @Override
    public void insertCategoria(Categoria categoria) {
        SqlParameterSource parameters = new BeanPropertySqlParameterSource(categoria);
        simpleJdbcInsert.execute(parameters);
    }

    @Override
    public void updateCategoria(Categoria categoria)// throws EjecucionException 
    {
        SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(
                categoria);
        this.namedParameterJdbcTemplate.update(SQL_UPDATE_CATEGORIA_XNOMBRE,
                parameterSource);
    }

    @Override
    public void deleteCategoria(Categoria categoria) //throws EjecucionException
    {
        SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(categoria);
        this.namedParameterJdbcTemplate.update(SQL_DELETE_CATEGORIA, parameterSource);
    }

    @Override
    public List selectCategoriaByNombre(Categoria categoria) {
        String query = SQL_SELECT_CATEGORIA_BY_NOMBRE;
        SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(categoria);
        return namedParameterJdbcTemplate.query(query, parameterSource, ParameterizedBeanPropertyRowMapper.newInstance(Categoria.class));
        // Esta es otra forma sin utilizar la clase CategoriaRowMapper	

    }

    @Override
    public List<Categoria> findAllCategorias() {
        {// Esta consulta es equivalente
            // String sql = "SELECT * FROM CATEGORIA";
            //String query=SQL_SELECT_CATEGORIA;
            SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(Categoria.class);
            return namedParameterJdbcTemplate.query(SQL_SELECT_CATEGORIA, parameterSource, ParameterizedBeanPropertyRowMapper.newInstance(Categoria.class));
        }
    }
}
